/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.beans;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.adapters.AdaptadorDeudaMovimientoCuentaIngreso;
import org.cip.esymons.tesoreria.adapters.DeudaCuentaIngreso;
import org.cip.esymons.tesoreria.adapters.DeudaMovimiento;
import org.cip.esymons.tesoreria.bc.AutorizacionPagoParcialDelegate;
import org.cip.esymons.tesoreria.bc.ColegiadoDelegate;
import org.cip.esymons.tesoreria.bc.MovimientoCuentaDelegate;
import org.cip.esymons.tesoreria.bc.PersonaNaturalDelegate;
import org.cip.esymons.tesoreria.bc.SolicitanteBusquedaDelegate;
import org.cip.esymons.tesoreria.be.AutorizacionPagoParcial;
import org.cip.esymons.tesoreria.be.DetPagoAgrupado;
import org.cip.esymons.tesoreria.be.EnumEstadoAutorizacion;
import org.cip.esymons.tesoreria.be.EnumTipoDeuda;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;

/**
 *
 * @author Gilmar
 */
public class AutorizacionPagoParcialController extends ControladorAbstracto{

    private AutorizacionPagoParcialDelegate delegadoAutorizacionPagoParcial;
    private PersonaNaturalDelegate delegadoPersonaNatural;
    private SolicitanteBusquedaDelegate delegadoSolicitanteBusqueda;
    private MovimientoCuentaDelegate delegadoMovimientoCuenta;
    private ColegiadoDelegate delegadoColegiado;
    private AutorizacionPagoParcial autorizacionPagoParcial;
    private int tipoBusquedaDNICIP;
    private String dnioNroCip;
    private Solicitante solicitanteSeleccionado;
    private DeudaMovimiento deudaMovimientoParaEventos;
    private DeudaCuentaIngreso deudaCuentaIngresoEvento;
    private DeudaMovimiento deudaMovimientoParaMultas;
    private DeudaCuentaIngreso deudaCuentaIngresoMulta;
    private DeudaMovimiento deudaMovimientoParaOtros;
    private DeudaCuentaIngreso deudaCuentaIngresoOtros;
    private DeudaMovimiento deudaMovimientoParaFraccionamiento;
    private DeudaCuentaIngreso deudaCuentaIngresoFraccionamiento;
    private DeudaMovimiento deudaMovimientoParaColegiatura;
    private DeudaCuentaIngreso deudaCuentaIngresoColegiatura;
    private Empleado empleadoSeleccionado;
    private String nombreResponsable;
    public AutorizacionPagoParcialController() {
        delegadoAutorizacionPagoParcial = new AutorizacionPagoParcialDelegate();
        delegadoMovimientoCuenta = new MovimientoCuentaDelegate();
        delegadoSolicitanteBusqueda = new SolicitanteBusquedaDelegate();
        delegadoPersonaNatural = new PersonaNaturalDelegate();
        delegadoColegiado = new ColegiadoDelegate();
    }

    public String busquedaAvanzada() {
        BusquedaPersonasController bpc = (BusquedaPersonasController) getBean("busquedaPersonasController");
        bpc.setControladorSolicitante(9);
        bpc.setComboTipoHabilitado(false);
        bpc.setApeMatPerNat(null);
        bpc.setApePatPerNat(null);
        bpc.setDniPerNat(null);
        bpc.setNomPerNat(null);
        bpc.setRazsocPerJur(null);
        bpc.setRucCliente(null);
        bpc.setTipoPersonaSeleccionada("NA");
        bpc.setBuscarSoloColegiados(true);
        return "busquedaAvanzada";
    }

    public String buscarPersona() {
        try {
            solicitanteSeleccionado = null;
            deudaMovimientoParaEventos = new DeudaMovimiento();
            deudaCuentaIngresoEvento = new DeudaCuentaIngreso();
            deudaMovimientoParaMultas = new DeudaMovimiento();
            deudaCuentaIngresoMulta = new DeudaCuentaIngreso();
            deudaMovimientoParaOtros = new DeudaMovimiento();
            deudaCuentaIngresoOtros = new DeudaCuentaIngreso();
            deudaMovimientoParaFraccionamiento = new DeudaMovimiento();
            deudaCuentaIngresoFraccionamiento = new DeudaCuentaIngreso();
            deudaMovimientoParaColegiatura = new DeudaMovimiento();
            deudaCuentaIngresoColegiatura = new DeudaCuentaIngreso();
            if (tipoBusquedaDNICIP == 0) {
                solicitanteSeleccionado = delegadoPersonaNatural.buscarXDni(dnioNroCip);
            } else {
                if (tipoBusquedaDNICIP == 1) {
                    Colegiado col = delegadoColegiado.buscarColegiadoXCip(Utiles.devuelveCipCompleto(dnioNroCip));
                    if (col != null) {
                        solicitanteSeleccionado = col.getPersonaNatural();
                    }
                } else {
                    solicitanteSeleccionado = delegadoSolicitanteBusqueda.buscarPorRuc(dnioNroCip);
                }
            }
            if (solicitanteSeleccionado != null) {
                deudaMovimientoParaEventos.setListaMovimientos(delegadoMovimientoCuenta.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.EVENTO));
                deudaCuentaIngresoEvento.setListaDeudaxIngreso(new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaEventos, true).getListaDeudaxIngreso());
                deudaMovimientoParaMultas.setListaMovimientos(delegadoMovimientoCuenta.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.MULTA));
                deudaCuentaIngresoMulta.setListaDeudaxIngreso(new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaMultas, true).getListaDeudaxIngreso());
                deudaMovimientoParaOtros.setListaMovimientos(delegadoMovimientoCuenta.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.OTROS));
                deudaCuentaIngresoOtros.setListaDeudaxIngreso(new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaOtros, true).getListaDeudaxIngreso());
                deudaMovimientoParaFraccionamiento.setListaMovimientos(delegadoMovimientoCuenta.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.FRACCIONAMIENTO));
                deudaCuentaIngresoFraccionamiento.setListaDeudaxIngreso(new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaFraccionamiento, true).getListaDeudaxIngreso());
                deudaMovimientoParaColegiatura.setListaMovimientos(delegadoMovimientoCuenta.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.COLEGIATURA));
                deudaCuentaIngresoColegiatura.setListaDeudaxIngreso(new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaColegiatura, true).getListaDeudaxIngreso());
            } else {
                ControladorAbstracto.warn("No existe la persona buscada.Intente con otro valor");
            }
        } catch (Exception e) {
            ControladorAbstracto.error("Sucedio un error grave.");
        }
        return null;
    }

    public String nuevo() {
        nombreResponsable = null;
        empleadoSeleccionado = null;
        autorizacionPagoParcial = new AutorizacionPagoParcial();
        tipoBusquedaDNICIP=1;
        dnioNroCip = null;
        solicitanteSeleccionado = null;
        deudaCuentaIngresoEvento = new DeudaCuentaIngreso();
        deudaCuentaIngresoMulta = new DeudaCuentaIngreso();
        deudaCuentaIngresoOtros = new DeudaCuentaIngreso();
        deudaCuentaIngresoColegiatura = new DeudaCuentaIngreso();
        return "nuevo";
    }

    public List<AutorizacionPagoParcial> getListaAutorizacion() {
        try {
            return delegadoAutorizacionPagoParcial.findAll();
        } catch (Exception e) {
            return new ArrayList<AutorizacionPagoParcial>();
        }
    }

    public String grabar() {
        try {
            if(empleadoSeleccionado!=null && nombreResponsable!=null && !nombreResponsable.trim().isEmpty()){
                List<DetPagoAgrupado> lista = new ArrayList<DetPagoAgrupado>();
                lista.addAll(deudaCuentaIngresoColegiatura.getListaDeudaxIngresoSeleccionados());
                lista.addAll(deudaCuentaIngresoEvento.getListaDeudaxIngresoSeleccionados());
                lista.addAll(deudaCuentaIngresoFraccionamiento.getListaDeudaxIngresoSeleccionados());
                lista.addAll(deudaCuentaIngresoMulta.getListaDeudaxIngresoSeleccionados());
                lista.addAll(deudaCuentaIngresoOtros.getListaDeudaxIngresoSeleccionados());
                if (lista.size() == 0) {
                    ControladorAbstracto.warn("No ha seleccionado ninguna deuda.");
                    return null;
                }
                int cant = 0;
                for (DetPagoAgrupado dpa : lista) {
                    int tamano = dpa.getListaMovimientos().size();
                    for (MovimientoCuenta mc : dpa.getListaMovimientos()) {
                        if(mc.isPagoParcial()){
                            cant++;
                            autorizacionPagoParcial = new AutorizacionPagoParcial();
                            autorizacionPagoParcial.setMcuCodigo(mc);
                            autorizacionPagoParcial.setPapEstado(EnumEstadoAutorizacion.Activo);
                            autorizacionPagoParcial.setPapFecha(new Date());
                            autorizacionPagoParcial.setPapMonto(mc.getMcuSaldo());
                            autorizacionPagoParcial.setPapSaldoModificado(dpa.getValorModificable() / tamano);
                            autorizacionPagoParcial.setPerEmpleado(empleadoSeleccionado);
                            delegadoAutorizacionPagoParcial.create(autorizacionPagoParcial);
                            mc.setMcuSaldo(dpa.getValorModificable() / tamano);
                            mc.setPagoParcial(true);
                            delegadoMovimientoCuenta.edit(mc);
                        }
                    }
                }
                if(cant>0){
                    ControladorAbstracto.info("Se insertó satisfactoriamente la autorización.");
                }else{
                    ControladorAbstracto.info("No se realizó la inserción debido a que las deudas se encuentran con una Autorización Vigente.");
                }
                return "buscar";
            }else{
               ControladorAbstracto.error("Debe Ingresar a la Persona responsable de la  Autorización.");
                return null;
            }
        } catch (Exception e) {
            ControladorAbstracto.error("Sucedió un error grave.");
            return null;
        }

    }

    /**
     * @return the tipoBusquedaDNICIP
     */
    public int getTipoBusquedaDNICIP() {
        return tipoBusquedaDNICIP;
    }

    /**
     * @param tipoBusquedaDNICIP the tipoBusquedaDNICIP to set
     */
    public void setTipoBusquedaDNICIP(int tipoBusquedaDNICIP) {
        this.tipoBusquedaDNICIP = tipoBusquedaDNICIP;
    }

    /**
     * @return the dnioNroCip
     */
    public String getDnioNroCip() {
        return dnioNroCip;
    }

    /**
     * @param dnioNroCip the dnioNroCip to set
     */
    public void setDnioNroCip(String dnioNroCip) {
        this.dnioNroCip = dnioNroCip;
    }

    /**
     * @return the solicitanteSeleccionado
     */
    public Solicitante getSolicitanteSeleccionado() {
        return solicitanteSeleccionado;
    }

    /**
     * @param solicitanteSeleccionado the solicitanteSeleccionado to set
     */
    public void setSolicitanteSeleccionado(Solicitante solicitanteSeleccionado) {
        this.solicitanteSeleccionado = solicitanteSeleccionado;
    }

    /**
     * @return the deudaCuentaIngresoEvento
     */
    public List<DetPagoAgrupado> getListaDeudaCuentaIngresoEvento() {
        try {
            return deudaCuentaIngresoEvento.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }

    }

    /**
     * @return the deudaCuentaIngresoMulta
     */
    public List<DetPagoAgrupado> getListaDeudaCuentaIngresoMulta() {
        try {
            return deudaCuentaIngresoMulta.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    /**
     * @return the deudaCuentaIngresoOtros
     */
    public List<DetPagoAgrupado> getListaDeudaCuentaIngresoOtros() {
        try {
            return deudaCuentaIngresoOtros.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    /**
     * @return the deudaCuentaIngresoFraccionamiento
     */
    public List<DetPagoAgrupado> getListaDeudaCuentaIngresoFraccionamiento() {
        try {
            return deudaCuentaIngresoFraccionamiento.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    /**
     * @return the deudaCuentaIngresoColegiatura
     */
    public List<DetPagoAgrupado> getListaDeudaCuentaIngresoColegiatura() {
        try {
            return deudaCuentaIngresoColegiatura.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    /**
     * @return the empleadoSeleccionado
     */
    public Empleado getEmpleadoSeleccionado() {
        return empleadoSeleccionado;
    }

    /**
     * @param empleadoSeleccionado the empleadoSeleccionado to set
     */
    public void setEmpleadoSeleccionado(Empleado empleadoSeleccionado) {
        this.empleadoSeleccionado = empleadoSeleccionado;
    }

    /**
     * @return the nombreResponsable
     */
    public String getNombreResponsable() {
        return nombreResponsable;
    }

    /**
     * @param nombreResponsable the nombreResponsable to set
     */
    public void setNombreResponsable(String nombreResponsable) {
        this.nombreResponsable = nombreResponsable;
    }
}
